package com.krui.iweibo.utils;

import java.security.MessageDigest;

public class MD5Utils {

	  /**
	   * 16进制字符集
	   */
	private static final char HEX_DIGITS[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
	/**
	 * 指定算法为MD5的MessageDigest
	 */
	private static MessageDigest messageDigest = null;
	
	
	/**
	 * 初始化加密算法为MD5
	 */
	static{
		try {
			messageDigest = MessageDigest.getInstance("MD5");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * MD5加密字符串
	 * @param str 目标字符串
	 * @return MD5加密后的字符串
	 */
	public static String getMD5String(String str){
		return getMD5String(str.getBytes());
	}
	
	
	/**
	 * MD5加密byte数组字符串
	 * @param bytes 目标byte
	 * @return MD5加密后的字符串
	 * 
	 */
	public static String getMD5String(byte[] bytes){
		messageDigest.update(bytes);
		return bytesToHex(messageDigest.digest());
	}
	
	/**
	 * 将字节数组转换成16进制字符串
	 * @param bytes 目标字节数组
	 * @return 转换结果
	 */
	
	public static String bytesToHex(byte[] bytes){
		return bytesToHex(bytes, 0, bytes.length);
	}
	
	
	/**
	 * 将字节数组中指定区间的子数组转换成16进制的字符串
	 * @param bytes 目标字节数组
	 * @param start 起始位置（包括自己）
	 * @param end 结束为止 （不包括自己）
	 * @return 转换结果
	 */
	public static String bytesToHex(byte[] bytes,int start,int end){
		StringBuilder sb = new StringBuilder();
		for(int i = start; i<start + end ; i++){
			sb.append(byteToHex(bytes[i]));
		}
		return sb.toString();
	}
	
	
	public static String byteToHex(byte bt){
		return HEX_DIGITS[( bt & 0xf0) >> 4] + "" + HEX_DIGITS[bt & 0xf];
	}
	
}
